﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace hse_2013_twinpics
{
    public partial class MainForm : Form
    {
        private Image[] Immas; // Массив для лицевых картинок
        
        // поля и метод для случайной привязки
        List<int> Genered; // сюда записываем пикиндексы по мере использования
        bool prove=true;
        private bool QuestCont(List<int> list, bool prove, Elementpic obj)
        {
            int counter=0;
            for (int i = 0; i < list.Count; i++)
                if (list[i] == obj.PicIndex)
                    counter++;
            if (counter == 2)
                prove = true;
            else
                prove = false;
            return prove;
        }

        // Размер поля для игры, просьба не менять, значение не влияет на размер формы
        const int FieldSize=4;

        // Массив картинок на поле
        private Elementpic[,] ElementPics;

        private void Pic_Click(object sender, EventArgs e)
        {
            ((Elementpic)sender).IsOpen = true;
            Elementpic.Open(((Elementpic)sender), Immas);
            for (int i = 0; i < FieldSize; i++)
                for (int j = 0; j < FieldSize; j++)
                {
                    if (ElementPics[i, j].IsOpen == true && ElementPics[i, j] != ((Elementpic)sender))
                        if (Elementpic.Compare(ElementPics[i, j], ((Elementpic)sender)))
                        {
                            ElementPics[i, j].Visible = false;
                            ((Elementpic)sender).Visible = false;
                            ElementPics[i, j].Enabled = false;
                            ((Elementpic)sender).Enabled = false;
                        }
                        else
                        {
                            Elementpic.Close((Elementpic)sender, Properties.Resources.cover);
                            Elementpic.Close(ElementPics[i, j], Properties.Resources.cover);
                            ((Elementpic)sender).IsOpen = false;
                            ElementPics[i, j].IsOpen = false;
                        }                        
                }

            /*
             * Здесь вся обработка свойств, переворачивание, сравнивание - ссылки на методы в элементпик
             */
        }


        public MainForm()
        {
            InitializeComponent();

            Immas = new Image[FieldSize * FieldSize / 2];

            Immas[0] = Properties.Resources.p0;
            Immas[1] = Properties.Resources.p1;
            Immas[2] = Properties.Resources.p2;
            Immas[3] = Properties.Resources.p3;
            Immas[4] = Properties.Resources.p4;
            Immas[5] = Properties.Resources.p5;
            Immas[6] = Properties.Resources.p6;
            Immas[7] = Properties.Resources.p7;


            ElementPics = new Elementpic[FieldSize,FieldSize]; // Создаем массив под картинки
            Genered = new List<int>();
            Random gen = new Random();
            for (int i = 0; i < FieldSize; i++)
                for (int j = 0; j < FieldSize; j++)
                {   // Заполняем массив картинок
                    prove = true;
                    ElementPics[i, j] = new Elementpic(i*FieldSize+j);
                    ((System.ComponentModel.ISupportInitialize)(this.ElementPics[i, j])).BeginInit();
                    ElementPics[i, j].Image = Properties.Resources.cover;
                    ElementPics[i, j].Location = new Point(i*70+6, j*70+28);
                    ElementPics[i, j].Name = "Im"+i.ToString()+j.ToString();
                    ElementPics[i, j].Size = new Size(64, 64);
                    ElementPics[i, j].TabIndex = 0;
                    ElementPics[i, j].TabStop = false;
                    ElementPics[i, j].Click += new EventHandler(this.Pic_Click);
                    while (prove)// здесь мы проверяем, чтобы каждый пикиндекс встречался не более двух раз
                    {
                        ElementPics[i, j].PicIndex = gen.Next(0, 8); // присваиваем рандомное число
                        prove = QuestCont(Genered, prove, ElementPics[i, j]); //запускаем проверочный метод
                        if (!prove) // если пруф=фолзе, т.е. действующий пикиндекс найден в списке использованных менее 2-х раз,
                            Genered.Add(ElementPics[i,j].PicIndex); // то записываем его в список и выходим из цикла,
                        // а если пикиндекс уже дважды встречался в списке, то присваиваем элементу массива другой пикиндекс, и так, пока не получится допустимый
                    }
                    ((System.ComponentModel.ISupportInitialize)(this.ElementPics[i, j])).EndInit();
                    this.Controls.Add(ElementPics[i, j]);
                }

        }
    }
}
